package com.bjxst;

import java.io.RandomAccessFile;

/**随机访问流 （java很少开发客户端软件，所以这个类比较少用）
 * RandomAccessFile 两个作用
 * 1，实现对一个文件做读和写的操作
 * 2，可以访问文件的任意位置，不像其它流只能按照先后顺序读取
 * 在开发某些客户端软件时，经常用到这个功能强大的可以“任意操作文件内容”的类*/
/*三个核心方法：
* 1，RandomAccessFile（String name, String mode）name 用来确定文件; mode
 取r(读)或rw(可读写)，通过mode可以确定流对文件的访问权限
 * 2，seek(long a) 用来定位流对象读写文件的位置， a 确定读写位置距离文件开头的字节个数
 * 3，getFilePointer() 获得流的当前读写位置*/
public class RandomAccessFileDemo {
    public static void main(String[] args) {
        RandomAccessFile raf = null;
        try{
            raf = new RandomAccessFile("d:/aa2.txt","rw");
            //将若干数据写入文件中
            int[] arr = new int[] {10,20,30,40,50,60,70,80,90,100};
            for(int i=0;i< arr.length;i++){
                raf.writeInt(arr[i]);
            }

            //指针移动，由0开始，一个一个字节移动,10是4个字节
            raf.seek(4);//指针从0移到4，字节却是从第5个字节开始读，20
            System.out.println(raf.readInt());
            //隔一个读一个
            for(int i = 0;i<10;i+=2){
                //每一个数是4个字节
                raf.seek(i*4);
                System.out.print(raf.readInt()+"\t");
            }
            System.out.println();
            System.out.println("------------");
            //在第8个字节位置插入一个39的数，替换30`
            raf.seek(8);
            raf.writeInt(39);
            for(int i=0;i< 10;i++){
                //因为一个数是4个字节，所以*4
                //如果raf.seek(i); 不可以正常读取，因为i不代表数组中的一个数
                raf.seek(i*4);
                System.out.print(raf.readInt()+"\t");
            }
            /*for(int i = 0;i<10;i+=2){
                //每一个数是4个字节
                raf.seek(i*4);
                System.out.print(raf.readInt()+"\t");
            }*/
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                if(raf != null){
                    raf.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}
